Skip to main content

Custom Tooltip Widget

Fully customize tooltip appearance and interaction behavior. You can create custom tooltip appearance and behavior by implementing the ILayeredTooltipWidget interface.

Implementing the Interface

Blueprint Implementation:

Custom Tooltip Widget-20250802145617328.webp

Custom Tooltip Widget-20250802145931001.webp

  • Add the ILayeredTooltipWidget interface in Class Settings → Interfaces → Implemented Interfaces
  • Implement each interface function in Blueprint

Custom Tooltip Widget-20250802145119869.webp

C++ Implementation:

UCLASS()
class UMyCustomTooltipWidget : public UUserWidget, public ILayeredTooltipWidget
{
GENERATED_BODY()
public:
// Required implementation
virtual void InitializeLayeredTooltip_Implementation(const FLayeredToolTipTriggerData& TriggerData) override;
virtual void SetLayeredTooltipTitle_Implementation(const FText& InText) override;
virtual void SetLayeredTooltipText_Implementation(const FText& InText) override;
virtual FOnTooltipDestroyDelegate& GetOnTooltipDestroyDelegate() override;

// Optional implementation
virtual void OnLayeredTooltipPinned_Implementation(bool bPinned) override;
virtual void OnLayeredTooltipStartTimer_Implementation(float Time) override;
virtual void OnLayeredTooltipStopTimer_Implementation() override;

private:
FOnTooltipDestroyDelegate OnTooltipDestroy;
};

Advanced Initialization

Payload-Based Dynamic Configuration:

void UMyCustomTooltipWidget::InitializeLayeredTooltip_Implementation(const FLayeredToolTipTriggerData& TriggerData)
{
// Change layout based on metadata
FString Type = TriggerData.TooltipData.FindRef("Type");
ConfigureLayoutForType(Type);

// Process complex data through payload
if (TriggerData.TriggerPayload)
{
ProcessPayloadData(TriggerData.TriggerPayload);
}
}

void UMyCustomTooltipWidget::ProcessPayloadData(UObject* Payload)
{
if (UItemData* Item = Cast<UItemData>(Payload))
{
// Display real-time item information
UpdateItemStats(Item);
BuildDynamicContent(Item);
}
else if (ACharacter* Character = Cast<ACharacter>(Payload))
{
// Monitor character status in real-time
MonitorCharacterStats(Character);
}
}

Pin State Management

Interactive Element Control:

void UMyCustomTooltipWidget::OnLayeredTooltipPinned_Implementation(bool bPinned)
{
if (bPinned)
{
// Advanced features shown only when pinned
DetailedInfoPanel->SetVisibility(ESlateVisibility::Visible);
InteractiveButtons->SetVisibility(ESlateVisibility::Visible);

// Start real-time updates
StartRealtimeUpdates();
}
else
{
StopRealtimeUpdates();
DetailedInfoPanel->SetVisibility(ESlateVisibility::Hidden);
}
}

Custom Timer UI:

void UMyCustomTooltipWidget::OnLayeredTooltipStartTimer_Implementation(float Time)
{
// Custom timer animation
if (TimerWidget)
{
TimerWidget->StartCountdown(Time);
}

// Visual feedback
PlayTimerStartEffect();
}

Nested Tooltip Support

Dynamic Rich Text Configuration:

void UMyCustomTooltipWidget::NativeConstruct()
{
Super::NativeConstruct();

// Add decorators to all rich text blocks
TArray<UWidget*> AllWidgets;
WidgetTree->GetAllWidgets(AllWidgets);

for (UWidget* Widget : AllWidgets)
{
if (URichTextBlock* RichText = Cast<URichTextBlock>(Widget))
{
RichText->SetDecorators({ULayeredTooltipDecorator::StaticClass()});
}
}
}

Register in Plugin Settings

Dynamically Configuring Tooltip Widgets Using Metadata_1.webp

Set your custom widget class in Project Settings → Plugins → LayeredTooltip Settings → Layered Tooltip Widget Class.